package com.bwie.rabbit.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/rabbitmq")
public class HelloWorldController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 第一种模型： 简单模型
     * 一个消息生产者  一个队列  一个消费者
     * @return
     */
    @GetMapping("/hello/world")
    public void helloWorld(){
        // 发送消息
        // 第一个参数： String routingKey 路由规则 【交换机 和队列的绑定规则 】  队列名称
        // 第二个参数： object message 消息的内容
        rabbitTemplate.convertAndSend("hello_world_queue","hello world rabbit!");
    }

    /**
     * 工作队列
     * 一个生产者  一个队列  多个消费者
     */
    @GetMapping("work/queue")
    public void workQueue() {
        for (int i = 1; i <= 10; i++) {
            rabbitTemplate.convertAndSend("work_queue", i + "hello work queue!");
        }
    }

    /**
     * 发布订阅
     * 一个生产者  多个队列   多个消费者   涉及 到交换机  fanout
     */
    @GetMapping("publish/subscribe")
    public void publishSubscribe() {
        // 第一个参数： 交换机的名称  没有要求
        // 第二个参数： 交换机和队列的绑定规则    如果是发布订阅模式 那么这个规则默认不写 只需要交换机和队列绑定即可不需要规则
        // 第三个参数： 消息内容
        rabbitTemplate.convertAndSend("publish_subscribe_exchange", "",
                "hello publisher subscribe!!");
    }

    /**
     * 路由模型
     * 一个生产者  多个队列   多个消费者   涉及 到交换机  direct
     */
    @GetMapping("routing")
    public void routing() {
        // 第一个参数： 交换机的名称  没有要求
        // 第二个参数： 交换机和队列的绑定规则    字符串 随意
        // 第三个参数： 消息内容
        rabbitTemplate.convertAndSend("routing_exchange", "aaa",
                "hello routing!!");
    }

    /**
     * 主题模型
     * 一个生产者  多个队列   多个消费者   涉及 到交换机  topic
     */
    @GetMapping("topic")
    public void topic() {
        // 第一个参数： 交换机的名称  没有要求
        // 第二个参数： 交换机和队列的绑定规则    多个单词  以 “.” 拼起来
        // 第三个参数： 消息内容
        rabbitTemplate.convertAndSend("topic_exchange", "cjq.age.name",
                "hello topic!!");
    }


}
